package com.fan.serializer;

import com.fan.annotation.FieldPermission;
import com.fan.pojo.UserInfo;
import com.fan.utils.UserProvider;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 字段权限序列化器修改器
 * 用于在序列化时根据FieldPermission注解过滤字段
 */
@Component
public class FieldPermissionBeanSerializerModifier extends BeanSerializerModifier {


    @Override
    public List<BeanPropertyWriter> changeProperties(SerializationConfig config, 
                                                   BeanDescription beanDesc, 
                                                   List<BeanPropertyWriter> beanProperties) {
        
        List<BeanPropertyWriter> newProperties = new ArrayList<>();
        
        for (BeanPropertyWriter writer : beanProperties) {
            FieldPermission fieldPermission = writer.getAnnotation(FieldPermission.class);
            
            if (fieldPermission != null) {
                // 为有权限注解的字段创建新的 PropertyWriter，每次序列化时检查权限
                newProperties.add(new BeanPropertyWriter(writer) {
                    @Override
                    public void serializeAsField(Object bean, JsonGenerator gen, 
                                                SerializerProvider prov) throws Exception {
                        
                        if (hasPermission(fieldPermission)) {
                            // 有权限，正常序列化该字段
                            super.serializeAsField(bean, gen, prov);
                        }
                        // 无权限则不序列化该字段（字段不会出现在 JSON 中）
                    }
                });
            } else {
                // 没有注解的字段正常处理
                newProperties.add(writer);
            }
        }
        
        return newProperties;
    }


    public boolean hasPermission(FieldPermission fieldPermission) {

        // 获取当前登录用户信息
        UserInfo userInfo = UserProvider.getUser();
        if (userInfo == null) {
            return false; // 用户未登录则无权限
        }

        if(userInfo.getIsAdministrator()){
            return true;
        }

        // 获取用户的角色编码列表
        List<String> userRoleCodes = userInfo.getRoleCodes();
        if (CollectionUtils.isEmpty(userRoleCodes)) {
            return false; // 用户没有角色则无权限
        }

        // 检查排除角色列表
        String[] excludeRoles = fieldPermission.excludeRoles();
        if (excludeRoles.length > 0) {
            List<String> excludeRoleList = Arrays.asList(excludeRoles);
            for (String userRole : userRoleCodes) {
                if (excludeRoleList.contains(userRole)) {
                    return false; // 用户角色在排除列表中，无权限
                }
            }
        }

        // 检查允许角色列表
        String[] allowedRoles = fieldPermission.roles();
        if (allowedRoles.length == 0) {
            return true; // 没有指定允许角色，则默认所有角色都有权限（除了排除的）
        }

        List<String> allowedRoleList = Arrays.asList(allowedRoles);
        for (String userRole : userRoleCodes) {
            if (allowedRoleList.contains(userRole)) {
                return true; // 用户角色在允许列表中，有权限
            }
        }

        return false; // 用户角色不在允许列表中，无权限
    }
}